/*
* Copyright 2011 Daniel Kurka
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.googlecode.gwtphonegap.client.contacts.browser;
import java.util.Date;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNull;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.googlecode.gwtphonegap.client.contacts.Contact;
import com.googlecode.gwtphonegap.client.contacts.ContactAddress;
import com.googlecode.gwtphonegap.client.contacts.ContactField;
import com.googlecode.gwtphonegap.client.contacts.ContactName;
import com.googlecode.gwtphonegap.client.contacts.ContactOrganisation;
import com.googlecode.gwtphonegap.collection.shared.CollectionFactory;
import com.googlecode.gwtphonegap.collection.shared.LightArray;
public class ContactBrowserImpl implements Contact {
private static final String CONTACT_FIELD_PREF = "pref";
private static final String CONTACT_FIELD_VALUE = "value";
private static final String CONTACT_FIELD_TYPE = "type";
private static final String NAME_SUFFIX = "suffix";
private static final String NAME_PREFIX = "prefix";
private static final String NAME_MIDDLE_NAME = "middleName";
private static final String NAME_GIVEN_NAME = "givenName";
private static final String NAME_FAMILY_NAME = "familyName";
private static final String NAME_FORMATTED = "formatted";
private static final String ADDRESS_COUNTRY = "country";
private static final String ADDRESS_POSTAL_CODE = "postalCode";
private static final String ADDRESS_REGION = "region";
private static final String ADDRESS_LOCALITY = "locality";
private static final String ADDRESS_STREET_ADDRESS = "streetAddress";
private static final String ADDRESS_FORMATTED = "formatted";
private static final String ORGANISATION_TITLE = "title";
private static final String ORGANISATION_DEPARTMENT = "department";
private static final String ORGANISATION_TYPE = "type";
private static final String ORGANISATION_PREF = "pref";
private static final String CONTACT_ORGANISATION = "organisation";
private static final String CONTACT_ADDRESSES = "addresses";
private static final String CONTACT_NAME = "name";
private static final String CONTACT_URLS = "urls";
private static final String CONTACT_CATEGORIES = "categories";
private static final String CONTACT_PHOTOS = "photos";
private static final String CONTACT_IMS = "ims";
private static final String CONTACT_EMAILS = "emails";
private static final String CONTACT_PHONE_NUMBERS = "phoneNumbers";
private static final String CONTACT_BIRTHDAY = "birthday";
private static final String CONTACT_NOTE = "note";
private static final String CONTACT_NICK_NAME = "nickName";
private static final String CONTACT_DISPLAY_NAME = "displayName";
private static final String FIELD_ID = "id";
private static final String ORGANISATION_NAME = "name";
private static final String ADDRESS_TYPE = "type";
private static final String ADDRESS_PREF = "pref";
private final ContactsBrowserImpl contactBrowserImpl;
private String id;
private String displayName;
private String nickName;
private Date birthday;
private String note;
private ContactName contactName;
private LightArray<ContactField> phoneNumbers;
private LightArray<ContactField> emails;
private LightArray<ContactAddress> contactAddresses;
private LightArray<ContactField> ims;
private LightArray<ContactOrganisation> organisations;
private LightArray<ContactField> photos;
private LightArray<ContactField> categories;
private LightArray<ContactField> urls;
public ContactBrowserImpl(ContactsBrowserImpl contactBrowserImpl) {
this.contactBrowserImpl = contactBrowserImpl;
}
public void setId(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
@Override
public String getDisplayName() {
if (displayName == null || "".equals(displayName)) {
String first = getName().getGivenName();
String lastName = getName().getGivenName();
String disp = "";
if (first != null) {
disp += first + " ";
}
if (lastName != null) {
disp += lastName;
}
displayName = disp;
}
return displayName;
}
@Override
public void setName(ContactName contactName) {
this.contactName = contactName;
}
@Override
public ContactName getName() {
if (contactName == null) {
contactName = new ContactNameBrowserImpl();
}
return contactName;
}
@Override
public void setNickName(String name) {
this.nickName = name;
}
@Override
public String getNickName() {
return nickName;
}
@Override
public LightArray<ContactField> getPhoneNumbers() {
if (phoneNumbers == null) {
phoneNumbers = CollectionFactory.constructArray();
}
return this.phoneNumbers;
}
@Override
public void setPhoneNumbers(LightArray<ContactField> array) {
this.phoneNumbers = array;
}
@Override
public void setEmails(LightArray<ContactField> emails) {
this.emails = emails;
}
@Override
public LightArray<ContactField> getEmails() {
if (emails == null) {
emails = CollectionFactory.constructArray();
}
return emails;
}
@Override
public void setContactAddresses(LightArray<ContactAddress> contactAddresses) {
this.contactAddresses = contactAddresses;
}
@Override
public LightArray<ContactAddress> getContactAddresses() {
if (contactAddresses == null) {
contactAddresses = CollectionFactory.constructArray();
}
return contactAddresses;
}
@Override
public void setIms(LightArray<ContactField> ims) {
this.ims = ims;
}
@Override
public LightArray<ContactField> getIms() {
if (ims == null) {
ims = CollectionFactory.constructArray();
}
return ims;
}
@Override
public void setOrganisations(LightArray<ContactOrganisation> organisations) {
this.organisations = organisations;
}
@Override
public LightArray<ContactOrganisation> getOrganisations() {
if (organisations == null) {
organisations = CollectionFactory.constructArray();
}
return this.organisations;
}
@Override
public Date getBirthDay() {
return birthday;
}
@Override
public void setBirthDay(Date birthday) {
this.birthday = birthday;
}
@Override
public void setNote(String note) {
this.note = note;
}
@Override
public String getNote() {
return note;
}
@Override
public void setPhotos(LightArray<ContactField> photos) {
this.photos = photos;
}
@Override
public LightArray<ContactField> getPhotos() {
if (photos == null) {
photos = CollectionFactory.constructArray();
}
return photos;
}
@Override
public void setCategories(LightArray<ContactField> categories) {
this.categories = categories;
}
@Override
public LightArray<ContactField> getCategories() {
if (categories == null) {
categories = CollectionFactory.constructArray();
}
return categories;
}
@Override
public void setUrls(LightArray<ContactField> urls) {
this.urls = urls;
}
@Override
public LightArray<ContactField> getUrls() {
if (urls == null) {
urls = CollectionFactory.constructArray();
}
return this.urls;
}
@Override
public void remove() {
contactBrowserImpl.remove(this);
}
@Override
public void save() {
contactBrowserImpl.save(this);
}
@Override
public Contact cloneContact() {
return contactBrowserImpl.cloneContact(this);
}
public static Contact fromJSON(ContactsBrowserImpl controller, JSONObject jsonContact) {
ContactBrowserImpl contact = new ContactBrowserImpl(controller);
// simple fields
contact.setId(getFieldAsString(jsonContact.get(FIELD_ID)));
contact.setDisplayName(getFieldAsString(jsonContact.get(CONTACT_DISPLAY_NAME)));
contact.setNickName(getFieldAsString(jsonContact.get(CONTACT_NICK_NAME)));
contact.setNote(getFieldAsString(jsonContact.get(CONTACT_NOTE)));
// birthday
JSONValue dateValue = jsonContact.get(CONTACT_BIRTHDAY);
if (dateValue != null && dateValue.isNumber() != null) {
contact.setBirthDay(new Date((long) dateValue.isNumber().doubleValue()));
}
// contact fields
JSONArray phoneNumberArray = jsonContact.get(CONTACT_PHONE_NUMBERS).isArray();
LightArray<ContactField> phoneNumbers = getContactFieldsForArray(phoneNumberArray);
contact.setPhoneNumbers(phoneNumbers);
JSONArray emailsArray = jsonContact.get(CONTACT_EMAILS).isArray();
LightArray<ContactField> emails = getContactFieldsForArray(emailsArray);
contact.setEmails(emails);
JSONArray imsArray = jsonContact.get(CONTACT_IMS).isArray();
LightArray<ContactField> ims = getContactFieldsForArray(imsArray);
contact.setIms(ims);
JSONArray photosArray = jsonContact.get(CONTACT_PHOTOS).isArray();
LightArray<ContactField> photos = getContactFieldsForArray(photosArray);
contact.setPhotos(photos);
JSONArray categoriesArray = jsonContact.get(CONTACT_CATEGORIES).isArray();
LightArray<ContactField> categories = getContactFieldsForArray(categoriesArray);
contact.setCategories(categories);
JSONArray urlsArray = jsonContact.get(CONTACT_URLS).isArray();
LightArray<ContactField> urls = getContactFieldsForArray(urlsArray);
contact.setUrls(urls);
ContactName name = getName(jsonContact.get(CONTACT_NAME).isObject());
contact.setName(name);
LightArray<ContactAddress> addresses = getAddressArray(jsonContact.get(CONTACT_ADDRESSES).isArray());
contact.setContactAddresses(addresses);
LightArray<ContactOrganisation> organisations = getContactOrganisationArray(jsonContact.get(CONTACT_ORGANISATION).isArray());
contact.setOrganisations(organisations);
return contact;
}
private static LightArray<ContactOrganisation> getContactOrganisationArray(JSONArray jsonArray) {
LightArray<ContactOrganisation> array = CollectionFactory.constructArray();
if (jsonArray == null) {
return array;
}
for (int i = 0; i < jsonArray.size(); i++) {
array.push(getOrganisation(jsonArray.get(i).isObject()));
}
return array;
}
private static ContactOrganisation getOrganisation(JSONObject object) {
ContactOrganisationBrowserImpl co = new ContactOrganisationBrowserImpl();
if (object == null) {
return co;
}
String name = getFieldAsString(object.get(ORGANISATION_NAME));
String department = getFieldAsString(object.get(ORGANISATION_DEPARTMENT));
String title = getFieldAsString(object.get(ORGANISATION_TITLE));
String type = getFieldAsString(object.get(ORGANISATION_TYPE));
boolean pref = getFieldAsBoolean(object.get(ORGANISATION_PREF));
co.setDepartment(department);
co.setName(name);
co.setTitle(title);
co.setType(type);
co.setPref(pref);
return co;
}
private static LightArray<ContactAddress> getAddressArray(JSONArray jsonArray) {
LightArray<ContactAddress> array = CollectionFactory.constructArray();
if (jsonArray == null) {
return array;
}
for (int i = 0; i < jsonArray.size(); i++) {
array.push(getAddress(jsonArray.get(i).isObject()));
}
return array;
}
private static ContactAddress getAddress(JSONObject object) {
ContactAddressBrowserImpl ca = new ContactAddressBrowserImpl();
if (object == null) {
return ca;
}
String formatted = getFieldAsString(object.get(ADDRESS_FORMATTED));
String streetAddress = getFieldAsString(object.get(ADDRESS_STREET_ADDRESS));
String locality = getFieldAsString(object.get(ADDRESS_LOCALITY));
String region = getFieldAsString(object.get(ADDRESS_REGION));
String postalCode = getFieldAsString(object.get(ADDRESS_POSTAL_CODE));
String country = getFieldAsString(object.get(ADDRESS_COUNTRY));
String type = getFieldAsString(object.get(ADDRESS_TYPE));
boolean pref = getFieldAsBoolean(object.get(ADDRESS_PREF));
ca.setFormatted(formatted);
ca.setStreetAddress(streetAddress);
ca.setLocality(locality);
ca.setRegion(region);
ca.setPostalCode(postalCode);
ca.setCountry(country);
ca.setType(type);
ca.setPref(pref);
return ca;
}
private static ContactName getName(JSONObject object) {
ContactNameBrowserImpl name = new ContactNameBrowserImpl();
if (object == null) {
return name;
}
String formatted = getFieldAsString(object.get(NAME_FORMATTED));
String familyName = getFieldAsString(object.get(NAME_FAMILY_NAME));
String givenName = getFieldAsString(object.get(NAME_GIVEN_NAME));
String middleName = getFieldAsString(object.get(NAME_MIDDLE_NAME));
String prefix = getFieldAsString(object.get(NAME_PREFIX));
String suffix = getFieldAsString(object.get(NAME_SUFFIX));
name.setFormatted(formatted);
name.setFamilyName(familyName);
name.setGivenName(givenName);
name.setMiddleName(middleName);
name.setHonorificPrefix(prefix);
name.setHonorificSuffix(suffix);
return name;
}
private static LightArray<ContactField> getContactFieldsForArray(JSONArray jsonArray) {
LightArray<ContactField> array = CollectionFactory.constructArray();
if (jsonArray == null) {
return array;
}
for (int i = 0; i < jsonArray.size(); i++) {
ContactFieldBrowserImpl cf = new ContactFieldBrowserImpl();
JSONObject object = jsonArray.get(i).isObject();
String type = getFieldAsString(object.get(CONTACT_FIELD_TYPE));
String value = getFieldAsString(object.get(CONTACT_FIELD_VALUE));
boolean pref = getFieldAsBoolean(object.get(CONTACT_FIELD_PREF));
cf.setPref(pref);
cf.setType(type);
cf.setValue(value);
array.push(cf);
}
return array;
}
private static boolean getFieldAsBoolean(JSONValue field) {
return field.isBoolean() != null ? field.isBoolean().booleanValue() : false;
}
private static String getFieldAsString(JSONValue field) {
return (field != null && field.isString() != null) ? field.isString().stringValue() : "";
}
public JSONObject serializeContact() {
JSONObject root = new JSONObject();
// simple values
root.put(FIELD_ID, getAsJSONString(this.getId()));
root.put(CONTACT_DISPLAY_NAME, getAsJSONString(this.getDisplayName()));
root.put(CONTACT_NICK_NAME, getAsJSONString(this.getNickName()));
if (this.getBirthDay() != null) {
double value = this.getBirthDay().getTime();
root.put(CONTACT_BIRTHDAY, new JSONNumber(value));
}
root.put(CONTACT_PHONE_NUMBERS, toJSONArray(this.getPhoneNumbers()));
root.put(CONTACT_EMAILS, toJSONArray(this.getEmails()));
root.put(CONTACT_IMS, toJSONArray(this.getIms()));
root.put(CONTACT_PHOTOS, toJSONArray(this.getPhotos()));
root.put(CONTACT_CATEGORIES, toJSONArray(this.getCategories()));
root.put(CONTACT_URLS, toJSONArray(this.getUrls()));
root.put(CONTACT_NAME, createContact(this.getName()));
root.put(CONTACT_ADDRESSES, createAddresses(this.getContactAddresses()));
root.put(CONTACT_ORGANISATION, createOrganisation(this.getOrganisations()));
return root;
}
private JSONArray createOrganisation(LightArray<ContactOrganisation> organisations) {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < organisations.length(); i++) {
ContactOrganisation co = organisations.get(i);
JSONObject orga = new JSONObject();
orga.put(ORGANISATION_NAME, getAsJSONString(co.getName()));
orga.put(ORGANISATION_DEPARTMENT, getAsJSONString(co.getDepartment()));
orga.put(ORGANISATION_TITLE, getAsJSONString(co.getTitle()));
orga.put(ORGANISATION_TYPE,getAsJSONString(co.getType()));
orga.put(ORGANISATION_PREF,JSONBoolean.getInstance(co.isPref()));
jsonArray.set(i, orga);
}
return jsonArray;
}
private JSONArray createAddresses(LightArray<ContactAddress> addresses) {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < addresses.length(); i++) {
ContactAddress contactAddress = addresses.get(i);
JSONObject address = new JSONObject();
address.put(ADDRESS_FORMATTED, getAsJSONString(contactAddress.getFormatted()));
address.put(ADDRESS_STREET_ADDRESS, getAsJSONString(contactAddress.getStreetAddress()));
address.put(ADDRESS_LOCALITY, getAsJSONString(contactAddress.getLocality()));
address.put(ADDRESS_REGION, getAsJSONString(contactAddress.getRegion()));
address.put(ADDRESS_POSTAL_CODE, getAsJSONString(contactAddress.getPostalCode()));
address.put(ADDRESS_COUNTRY, getAsJSONString(contactAddress.getCountry()));
address.put(ADDRESS_TYPE, getAsJSONString(contactAddress.getType()));
address.put(ADDRESS_PREF, JSONBoolean.getInstance(contactAddress.isPref()));
jsonArray.set(i, address);
}
return jsonArray;
}
private JSONObject createContact(ContactName contactName) {
JSONObject jsonName = new JSONObject();
jsonName.put(NAME_FORMATTED, getAsJSONString(contactName.getFormatted()));
jsonName.put(NAME_FAMILY_NAME, getAsJSONString(contactName.getFamilyName()));
jsonName.put(NAME_GIVEN_NAME, getAsJSONString(contactName.getGivenName()));
jsonName.put(NAME_MIDDLE_NAME, getAsJSONString(contactName.getMiddleName()));
jsonName.put(NAME_PREFIX, getAsJSONString(contactName.getHonorificPrefix()));
jsonName.put(NAME_SUFFIX, getAsJSONString(contactName.getHonorificSuffix()));
return jsonName;
}
private JSONValue toJSONArray(LightArray<ContactField> contactField) {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < contactField.length(); i++) {
ContactField field = contactField.get(i);
JSONObject jsonField = new JSONObject();
jsonField.put(CONTACT_FIELD_TYPE, getAsJSONString(field.getType()));
jsonField.put(CONTACT_FIELD_VALUE, getAsJSONString(field.getValue()));
jsonField.put(CONTACT_FIELD_PREF, JSONBoolean.getInstance(field.isPref()));
jsonArray.set(i, jsonField);
}
return jsonArray;
}
private static JSONValue getAsJSONString(String id) {
if (id == null) {
return JSONNull.getInstance();
}
return new JSONString(id);
}
}